package com.rpoonolly.simplegame.mapio.jsoncoders;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import com.rpoonolly.simplegame.textures.TextureId;
import com.rpoonolly.simplegame.worldGrid.GridCoordinate;
import com.rpoonolly.simplegame.worldGrid.WorldGridTile;

public class WorldGridTileJSONCoder extends JSONCoder<WorldGridTile>{
	private static WorldGridTileJSONCoder singletonInstance = null;
	private GridCoordinateJSONCoder coordCoder = GridCoordinateJSONCoder.getInstance();
	private TextureIdJSONCoder textCoder = TextureIdJSONCoder.getInstance();
	
	private WorldGridTileJSONCoder() {}

	@SuppressWarnings("unchecked")
	@Override
	public JSONObject encode(WorldGridTile obj) throws IOException {
		JSONArray jsonTextures = new JSONArray();
		for(TextureId texture : obj.getTextures())
			jsonTextures.add(textCoder.encode(texture));
		
		JSONObject jsonTile = new JSONObject();
		jsonTile.put("textures", jsonTextures);
		jsonTile.put("coordinate", coordCoder.encode(obj.getCoordinate()));
						
		return jsonTile;
	}

	@Override
	public WorldGridTile decode(JSONObject jsonTile) throws IOException {
		JSONArray jsonTextures = (JSONArray) jsonTile.get("textures");
		List<TextureId> textures = new CopyOnWriteArrayList<TextureId>(); 
		
		JSONObject jsonText;
		TextureId textId;
		for(Object obj : jsonTextures) {
			jsonText = (JSONObject) obj;
			textId = textCoder.decode(jsonText);
			textures.add(textId);
		}
		
		GridCoordinate coord = coordCoder.decode((JSONObject) jsonTile.get("coordinate"));
		return new WorldGridTile(coord, textures);
	}

	public static WorldGridTileJSONCoder getInstance() {
		if (singletonInstance == null)
			singletonInstance = new WorldGridTileJSONCoder();
		
		return singletonInstance;
	}
}
